项目用Springboot Resttemplate做REST调用,测试发现个问题,就是URL参数值中如果有加号(+)就会变成空格,如: “http://localhost/rest?a=5+6=”,服务端收到:a=“5 6=”,也就是说,RestTemplate不对“+”encoding。我们也可以把值当参数,不写死在URL中,让RestTemplate处理,但RestTemplate不支持数组参数,如:a=1&a=2&a=3。那我们把“5+6=”先encode行不? 答案很残酷,根本不行,这样的话,服务端收到“5%2B6%3D”,需要服务端特别对这个值decode,服务端的同学不答应哦! 后来查阅了RestTemplate,发现getForEntity方法中,如果传递的是URI对象,它就不做处理,原封不动地传送,所以,我们自己对URL中的参数值encoding后,转成URI,再调用Spring RestTemplate,就能正确传递加号(+)了。 示例代码:
tags[0] = "5+6=";
String url = "http://localhost:8080/api?a";
for (String tag: tags){
url += "&tags=" + UriEncoder.encode(tag);
}
resp = restTemplate.getForEntity(new URI(url), ResponseVo.class);
另外,有同学可能会问,你为什么不用Openfeign呢?这个是因为我们服务端使用spring-webflux(react模式)提高吞吐量,导致openfeign无法使用。
|